package com.chat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

public class MyChatServerHandler extends SimpleChannelInboundHandler<String> {

	// 保存着所有与服务器建立好连接的channel对象
	public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		// channelGroup的writeAndFlush会遍历里面的每一个channel
		channelGroup.writeAndFlush("[服务器]  - " + channel.remoteAddress() + " 加入\n");
		channelGroup.add(channel);
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		System.out.println(channel.remoteAddress() + " 上线\n");
	}

	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		System.out.println(channel.remoteAddress() + " 下线\n");
	}

	// 当客户端离开
	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		channelGroup.writeAndFlush("[服务器]  - " + channel.remoteAddress() + " 离开\n");
		// 写不写都可以，因为channelGroup会自动把断掉的channel删除
		// channelGroup.remove(channel);
	}

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
		Channel channel = ctx.channel();

		channelGroup.forEach(ch -> {
			if(channel != ch) {
				ch.writeAndFlush(channel.remoteAddress() + " 发送的消息：" + msg);
			}  else {
				ch.writeAndFlush("【自己】：" + msg);
			}
		});
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
		ctx.close();
	}

}
